(function () {
    function getUrlParameter(variable) {
        var query = window.location.search.substring(1);
        var vars = query.split('&');
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split('=');
            if (pair[0] === variable) {
                return pair[1];
            }
        }
    }

    var rpcServiceId = window.__rpc_service_id__;
    //
    if (!rpcServiceId) {
        rpcServiceId = window.frameElement && window.frameElement.getAttribute('data-rpc-service-id');
    }
    if (!rpcServiceId) {
        rpcServiceId = getUrlParameter('__rpc_service_id__');
    }
    //
    var eventHandlers = {};
    window.eventService = {
        onEvent: function (type, handler) {
            eventHandlers[type] = {
                type: type,
                handler: handler,
                once: false
            };
        },
        offEvent: function (type) {
            delete eventHandlers[type];
        },
        onceEvent: function (type, handler) {
            eventHandlers[type] = {
                type: type,
                handler: handler,
                once: true
            };
        }
    };
    //
    var __informatRpc = new RPC({
        target: window.parent,
        serviceId: rpcServiceId
    });
    __informatRpc.expose('rpcEvent', (data) => {
        const eventHandler = eventHandlers[data.type];
        if (!eventHandler || !eventHandler.handler) {
            return;
        }
        eventHandler.handler(data.payload);
        if (eventHandler.once) {
            eventService.offEvent(eventHandler.type);
        }
    });

    /**
     * 系统级暴露接口
     */
    window.systemService = {
        /**
         * 调用自动化
         * @param obj
         * @example
         * ```javascript
         * {
         *   // 自动化ID
         *   automaticId:null,
         *   // 自动化参数
         *   args:[]
         * }
         * ```
         *
         * @returns {*}
         */
        callAutomatic: function (obj) {
            return __informatRpc.call('systemService.callAutomatic', obj);
        },
        toast: function (message) {
            return __informatRpc.call('systemService.toast', message);
        },
        confirm: function (options) {
            return __informatRpc.call('systemService.confirm', options);
        },
        getUser: function () {
            return __informatRpc.call('systemService.getUser');
        },
        getApp: function () {
            return __informatRpc.call('systemService.getApp');
        },
        getToken: function () {
            return __informatRpc.call('systemService.getToken');
        },
        /**
         * 获取服务器地址
         */
        getServerUrl: function () {
            return __informatRpc.call('systemService.getServerUrl');
        },
        /**
         * 获取浏览器访问的地址
         */
        getClientUrl: function () {
            return __informatRpc.call('systemService.getClientUrl');
        },
        /**
         * 关闭当前弹窗
         * @returns {Promise<unknown> | void}
         */
        close: function () {
            return __informatRpc.call('systemService.close');
        },
        /**
         * 关闭
         * @param data
         * @returns {Promise<unknown> | void}
         */
        payload: function (data) {
            return __informatRpc.call('systemService.payload', data);
        },
        /**
         * 预览图片
         * @param options 结构
         *
         * options 结构
         * ```javascript
         * {
         *     // 预览的图片在列表中的索引位置，从0 开始
         *     startIndex:0,
         *     // 预览的图片列表
         *     list:[
         *         {
         *             // 图片Id，可选
         *             id:'xxx',
         *             // 图片名称，可选
         *             name:'xxx.jpg',
         *             // 图片预览地址，必选
         *             src:'https://xxxx.xxx/xxx.jpg'
         *         }
         *     ]
         * }
         * ```
         */
        previewImage: function (options) {
            return __informatRpc.call('systemService.previewImage', options);
        }
    };
    /**
     * 数据表服务
     */
    window.tableService = {
        /**
         * 通过数据表标识符查询数据表信息
         * @param tableId
         * @returns {Promise<unknown> | void}
         */
        getTableInfo: function (tableId) {
            return __informatRpc.call('tableService.getTableInfo', { tableId: tableId });
        },
        /**
         * 通过数据表ID查询数据表记录
         * @param tableId
         * @param recordId
         */
        queryRecordById: function (tableId, recordId) {
            return __informatRpc.call('tableService.queryRecordById', {
                tableId: tableId,
                recordId: recordId
            });
        }
    };

    // 字段暴露接口
    window.customFieldService = {
        getRecord: function () {
            return __informatRpc.call('customFieldService.getRecord');
        },
        getField: function () {
            return __informatRpc.call('customFieldService.getField');
        },
        getTableInfo: function () {
            return __informatRpc.call('customFieldService.getTableInfo');
        },
        /**
         * 设置表单字段值
         * @param obj
         * @example
         * ```javascript
         * {
         *   // 字段标识符
         *   field,
         *   // 字段值
         *   value
         * }
         * @returns {*}
         */
        setFieldValue: function (obj) {
            return __informatRpc.call('customFieldService.setFieldValue', obj);
        },
        /**
         * 判断当前表达的字段是否可编辑
         * @param {string} field 字段标识符
         * @returns {*}
         */
        isFieldEditable: function (field) {
            return __informatRpc.call('customFieldService.isFieldEditable', field);
        },
        /**
         * 判断当前表达的字段是否可见
         * @param {string} field 字段标识符
         * @returns {*}
         */
        isFieldVisible: function (field) {
            return __informatRpc.call('customFieldService.isFieldVisible', field);
        },
        /**
         * 获取当前Form的上下文Id
         * @returns {*}
         */
        getFormSourceId: function () {
            return __informatRpc.call('customFieldService.getFormSourceId');
        },
        /**
         * 表单展示loading
         * @return {Promise<unknown> | void}
         */
        showLoading() {
            return __informatRpc.call('customFieldService.showLoading');
        },
        /**
         * 表单隐藏Loading
         * @return {Promise<unknown> | void}
         */
        hideLoading() {
            return __informatRpc.call('customFieldService.hideLoading');
        }
    };

    // 自定义视图暴露接口
    window.customViewService = {
        getTableView: function () {
            return __informatRpc.call('customViewService.getTableView');
        },
        getRecordList: function () {
            return __informatRpc.call('customViewService.getRecordList');
        },
        getTableInfo: function () {
            return __informatRpc.call('customViewService.getTableInfo');
        },
        openRecord: function (id) {
            return __informatRpc.call('customViewService.openRecord', id);
        },
        reload: function () {
            return __informatRpc.call('customViewService.reload');
        },
        refresh: function () {
            return __informatRpc.call('customViewService.refresh');
        },
        setSelectedRecordIdList: function (idList) {
            return __informatRpc.call('customViewService.setSelectedRecordIdList', idList);
        },
        setContextMenuRecordId: function (recordId) {
            return __informatRpc.call('customViewService.setContextMenuRecordId', recordId);
        }
    };
})();
